package com.dtx.qiku.method;

import com.dtx.qiku.goods.entity.Goods;
import com.dtx.qiku.goods.service.GoodsService;
import com.dtx.qiku.goods.service.impl.GoodsServiceImpl;
import org.junit.Test;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Parameter;
import java.util.Arrays;

/**
 * 获取方法Method
 */
public class TestMethod {

    @Test
    public void test() throws Exception{
        // 获取 GoodsServiceImpl 类中对应的 addGoods 方法

        Class<GoodsServiceImpl> clz = GoodsServiceImpl.class;

        // 获取指定的 addGoods方法
        Method method = clz.getDeclaredMethod("addGoods", Goods.class);

        GoodsService service = clz.getDeclaredConstructor().newInstance();

        // 获取 方法的 修饰符
        System.out.println(Modifier.isPublic(method.getModifiers()));

        // 获取 方法的 返回值 类型
        Class<?> returnType = method.getReturnType();
        System.out.println(returnType);

        // 获取 方法名
        System.out.println(method.getName());

        // 获取 方法的 参数类型 列表
        Class<?>[] parameterTypes = method.getParameterTypes();
        System.out.println(Arrays.toString(parameterTypes));

        // 获取 方法参数的个数
        System.out.println(method.getParameterCount());

        System.out.println(Arrays.toString(method.getGenericExceptionTypes()));

        Parameter[] parameters = method.getParameters();

        // 反射无法获取 方法参数的名称
        // 在方法的定义中，参数 是 形参
        // 形参 更关注的是 类型，而非名字，名字叫啥都可以
        for (Parameter p : parameters) {
            System.out.println(p.getName());
            System.out.println(p.getType());
        }

        Goods goods = new Goods();

        // 通过 反射 调用 指定的方法

        System.out.println(method.invoke(service, goods));
    }
}
